package io.vertx.spi.cluster.zookeeper;
import io.vertx.core.Vertx;
import io.vertx.core.spi.cluster.ClusterManager;
import io.vertx.test.core.VertxTestBase;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by stream.
*/
public class ConsumerRoundRobinTest extends VertxTestBase {
private static final String MESSAGE_ADDRESS = "consumerAddress";
protected ClusterManager getClusterManager() {
MockZKCluster zkCluster = new MockZKCluster();
return zkCluster.getClusterManager();
}
private CompletableFuture<Void> addConsumer(int index) {
CompletableFuture<Void> future = new CompletableFuture<>();
vertices[0].eventBus().
consumer(MESSAGE_ADDRESS, message -> message.reply(index)).
completionHandler(event -> {
if (event.succeeded()) {
future.complete(null);
} else {
future.completeExceptionally(event.cause());
}
});
return future;
}
@Override
public void setUp() throws Exception {
super.setUp();
startNodes(1);
CountDownLatch latch = new CountDownLatch(1);
addConsumer(0).thenCompose(aVoid -> addConsumer(1)).thenCompose(aVoid -> addConsumer(2)).
whenComplete((aVoid, throwable) -> {
if (throwable != null) {
fail(throwable);
} else {
latch.countDown();
}
});
awaitLatch(latch);
}
@Test
public void roundRobin() {
AtomicInteger counter = new AtomicInteger(0);
Set<Integer> results = new HashSet<>();
Vertx vertx = vertices[0];
vertx.setPeriodic(500, aLong -> vertx.eventBus().send(MESSAGE_ADDRESS, "Hi", message -> {
if (message.failed()) {
fail(message.cause());
} else {
Integer result = (Integer) message.result().body();
results.add(result);
if (counter.incrementAndGet() == 3) {
assertEquals(results.size(), counter.get());
testComplete();
}
}
}));
await();
}
}